#include <cstddef>
#include <iostream>
#include <malloc.h>
using namespace std;

class Node
{
public:
    int data;
    Node* next;
    //构造函数初始化，这个语法用于初始化对象的数据成员
    Node(int data,Node* next=nullptr):data(data),next(next){}
};

class LinkQueue
{
private:
    Node* front;//需要注意的是这两个是指针
    Node* rear;

public:
    LinkQueue():front(nullptr),rear(nullptr){}

    //删除链队列
    ~LinkQueue(){
        while(front!=nullptr)
        {
            Node* temp=front;//取临时指针
            front=front->next;//将头指针轮询指向空指针，因为原front->next是空指针
            delete temp;
        }
        rear=nullptr;
    }

    void enQueue(int data)
    {
        Node* temp=new Node(data);
        if(rear != nullptr)
        {
            rear->next=temp;
        }
        rear=temp;
        if(front==nullptr)
        {
            front=temp;
        }
    }

    int deQueue(void)
    {
        Node* temp;
        int data;

        if(front==nullptr)
        {
            cerr<<"队列为空"<<endl;
            return -1;
        }
        data=front->data;
        front=front->next;//指向空指针
        if(front==nullptr)//只有一个元素的队列出队；
        {
            rear=nullptr;//指针清空
        }
        delete temp;
        return data;
    }

    bool isEmpty() const
    {
        return front==nullptr;
    }

    //这一步有大问题 链队列不支持从后向前访问
    //你应该从头部开始打印队列，直到遇到 nullptr。并且，你不应该删除遍历过程中的任何节点。
    int printQueue()
    {
        Node* temp=front;

        if(front==nullptr)
        {
            cerr<<"队列为空"<<endl;
            return -1;
        }
        while (temp!=nullptr)
        {
            cout<<temp->data<<" ";
            temp=temp->next;
        }
        cout<<endl;
        delete temp;
        return 0;
    }

    //错误示范
    // int printQueue()
    // {
    // Node* temp;
    // if(front==nullptr)
    // {
    //     cerr<<"队列为空"<<endl;
    //     return -1;
    // }
    // temp=rear;
    // while (temp!=front)
    // {
    //     cout<<temp->data<<" ";
    //     temp=temp->next;
    // }
    // delete temp;
    // return 0;
    // }
};

int main(int argc,char **argv)
{
    LinkQueue q;
    q.enQueue(1);
    q.enQueue(2);
    q.enQueue(3);

    q.printQueue();
    q.deQueue();
    q.printQueue();
}